package com.tang.service;

import com.tang.base.BaseRedis;
import com.tang.constant.Cons;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

public class MsgSendReturnCallback extends BaseRedis implements RabbitTemplate.ReturnCallback{

    private static final Logger logger = LogManager.getLogger(MsgSendReturnCallback.class);

    /**
     * 当消息从交换机到队列失败时，该方法被调用。（若成功，则不调用）
     * confirmcallback用来确认消息是否有送达消息队列的判定标志
     * 如果消息没有到exchange,则confirm回调,ack=false 如果消息到达exchange,则confirm回调,ack=true 但如果是找不到exchange，则会先触发returncallback
     * 需要注意的是：该方法调用后，MsgSendConfirmCallBack中的confirm方法也会被调用，且ack = true
     * @param message
     * @param replyCode
     * @param replyText
     * @param exchange
     * @param routingKey
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        logger.info("MsgSendReturnCallback [消息从交换机到队列失败]  message："+message);
        logger.info("send message failed: " + replyCode + " " + replyText);
        // TODO 消息从交换机到队列失败，重新发送
        // 重新发送消息
        rabbitTemplate.convertAndSend(Cons.TOPIC_EXCHANGE_NAME, Cons.OBJECT_ROUTING_KEY, message);
        // rabbitTemplate.send(message);
    }
}
